home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / amiexpress / source / doors / newchat / newchat.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-12-26  |  29.6 KB  |  770 lines

  1. #include <exec/exec.h>
  2. #include <exec/semaphores.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include "work:romconf/doorheader.h"
  6. #include <proto/exec.h>
  7. #include <string.h>
  8. #include "source:aztec/glue.h"
  9. extern struct JHMessage *Jhmsg;
  10. #define CHAT_ENTER 5
  11. #define CHAT_EXIT  4
  12. #define CHAT_IDLE  3
  13. #define CHAT_TEXT  2
  14. #define CHAT_NONE  1
  15. #define CHAT_NTXT  6
  16. #define CHAT_CHANNEL 7
  17. #define CHAT_INVITE 8
  18. #define CHATROOM_EXIT 9
  19. #define ALL -1
  20. #define pu putuserstring
  21. #define gu getuserstring
  22. #define sm sendmessage
  23. #define pm prompt
  24. #define CTRL(c) (c-'A'+1)
  25.  char myname[40];
  26.  
  27. struct NodeStat
  28. {
  29.   char Status;
  30.   char info;
  31. };
  32. struct NodeInfo
  33. {
  34.   char Handle[31];
  35.   ULONG StartTime;
  36.   int ChatColor;
  37.   int Channel;
  38.   int Private;
  39.   struct NodeStat Stats[10];
  40.   APTR t;
  41.   APTR s;
  42.   unsigned long tasksignal;
  43. };
  44.  
  45. struct MultiPort
  46. {
  47.   struct SignalSemaphore semi;
  48.   struct MinList sl_List;
  49.   struct NodeInfo MyNode[10];
  50.   UBYTE SemiName[20];
  51. } *Nodes;
  52.  
  53. struct SinglePort
  54. {
  55.   struct SignalSemaphore semi;
  56.   struct MinList sl_List;
  57.   APTR s;
  58.   UBYTE SemiName[20];
  59.   int Status;
  60.   char Handle[31];
  61.   char Location[31];
  62.   char Misc1[100];
  63.   char Misc2[100];
  64. } *SingleNode;
  65.  
  66. APTR Singles[10];
  67. char MultiName[] = "AEMulti";
  68.  
  69. void my_Interact(void);
  70. void SendSig(int node);
  71. void InitNodes(struct MultiPort *s);
  72. void InitMultiNode(void);
  73. void LastCommand(void);
  74. void end(void);
  75. void creds(void);
  76. void ShowActive(void);
  77. void page(void);
  78. void ShowMenu(void);
  79. void Process(int opt, int info);
  80. void who(int opt);
  81. int mynode;
  82. #define hk hotkey
  83. struct MsgPort *mychatp;
  84. char SingleName[] = "AEStat ";
  85. int defaultroom=0;
  86. main(int argc,char *argv[])
  87. {
  88.    char t[200];
  89.    int chatargc;
  90.    register int i;
  91.    if(argc!=2)
  92.    {
  93.      printf("MultiNode Chat by ByteMaster\n");
  94.      printf("\n");
  95.      exit(0);
  96.    }
  97.    Register(argv[1][0]-'0');
  98.    mynode=argv[1][0]-'0';
  99.    mychatp=CreatePort(0,0L);
  100.  getuserstring(t,BB_TASKPRI);
  101.   SetTaskPri(FindTask(0),atol(t));
  102.    strcpy(t,"25"); pu(t,ENVSTAT);
  103.    PutInfo(1,BB_NONSTOPTEXT);
  104.    gu(t,BB_MAINLINE);
  105.    i=0; while(t[i]!='\0')
  106.    {
  107.       if(t[i]==' ' && t[i+1]!='\0')
  108.         { defaultroom=atoi(&t[i+1]);
  109.           if(defaultroom>1000) defaultroom=0;
  110.           if(defaultroom<0) defaultroom=0;
  111.           break;
  112.         }
  113.       i++;
  114.    }
  115.    creds();
  116.    InitMultiNode();
  117.    my_Interact();
  118. }
  119. void InitNodes(struct MultiPort *s)
  120. {
  121.   register int i=0;
  122.   register int j=0;
  123.   while(i<9)
  124.   {
  125.      strcpy(s->MyNode[i].Handle,"");
  126.      for(j=0;j<9;j++)
  127.      {
  128.        s->MyNode[i].Stats[j].info='\0';
  129.        s->MyNode[i].Stats[j].Status=CHAT_NONE;
  130.        if(j==mynode && j!=i) s->MyNode[i].Stats[j].Status=CHAT_IDLE;
  131.      }
  132.      
  133.      s->MyNode[i].t=NULL;
  134.      s->MyNode[i].tasksignal=NULL;
  135.      s->MyNode[i].StartTime=NULL;
  136.      i++;
  137.   }
  138. }
  139. void InitMultiNode(void)
  140. {
  141.   unsigned long signal;
  142.   
  143.   register int i,j;
  144.   int status;
  145.   Jhmsg->signal= getsignal();
  146.   signal = 1L << (Jhmsg->signal);
  147.   pu("",BB_GETTASK);
  148.   gu(myname,DT_NAME);
  149.   
  150.   Nodes=(struct MultiPort *)GetSemaphore();
  151.     ObtainSemaphore((struct SignalSemaphore *)Nodes);
  152.       SingleNode=(struct SinglePort *)Nodes->MyNode[mynode].s;
  153.       ObtainSemaphore((struct SignalSemaphore *)SingleNode);
  154.        status = SingleNode->Status;
  155.       ReleaseSemaphore((struct SignalSemaphore *)SingleNode);
  156.  
  157.     for(i=0;i<9;i++)
  158.     {
  159.       for(j=0;j<9;j++)
  160.       {
  161.         if(i!=mynode && j==mynode)
  162.         {
  163.             Nodes->MyNode[i].Stats[j].Status=CHAT_ENTER;
  164.             if(Nodes->MyNode[i].Channel==defaultroom) Nodes->MyNode[i].Stats[j].info=(status>=-1)? 1:0;
  165.             else Nodes->MyNode[i].Stats[j].info=0;
  166.         }
  167.       }
  168.       Singles[i]=Nodes->MyNode[i].s;
  169.       if(Nodes->MyNode[mynode].Stats[i].Status==CHAT_EXIT || Nodes->MyNode[mynode].Stats[i].Status==CHAT_NONE)Nodes->MyNode[mynode].Stats[i].Status=CHAT_NONE;
  170.       else Nodes->MyNode[mynode].Stats[i].Status=CHAT_IDLE ;
  171.     }
  172.       strcpy(Nodes->MyNode[mynode].Handle,myname);
  173.          Nodes->MyNode[mynode].tasksignal=signal;
  174.        Nodes->MyNode[mynode].t=(struct Task *)Jhmsg->aeproc;
  175.        Nodes->MyNode[mynode].Channel=defaultroom;
  176.        Nodes->MyNode[mynode].Private=0;
  177.        Nodes->MyNode[mynode].StartTime=time(NULL);
  178.     ShowActive();
  179.     sm("",1);
  180.     sm("Press <CTRL-F> to see Functions",1); sm("",1);
  181.     SendSig(ALL);
  182.     ReleaseSemaphore((struct SignalSemaphore *)Nodes);
  183.     
  184. }
  185.  
  186. void SendSig(int node)
  187. {
  188.    register int i=0;
  189.    while(i<9)
  190.    {
  191.      if(i!=mynode && (node==-1 || node==i))
  192.      {
  193.        if(Nodes->MyNode[i].t !=NULL && Nodes->MyNode[mynode].Stats[i].Status!=CHAT_NONE)
  194.          Signal(Nodes->MyNode[i].t,Nodes->MyNode[i].tasksignal);
  195.      }
  196.      i++;
  197.    }
  198. }
  199. void my_Interact(void)
  200. {
  201.    char mes[10];
  202.    char temp[100];
  203.    char temp1[100];
  204.    char temp2[10];
  205.    int lastchannel;
  206.    int status=0;
  207.    register int i;
  208.    char t[10];
  209.    int Last=0;
  210.    strcpy(mes,"");
  211.    strcpy(temp,"");
  212.    mes[1]='\0';
  213.    strcpy(temp," m");
  214.    Process(1,0);
  215.    Last=2;
  216.    while(1)
  217.    {
  218.       mes[0]=sigkey();
  219.       switch(mes[0])
  220.       {
  221.          case 0:
  222.               ObtainSemaphore((struct SignalSemaphore *)Nodes);
  223.               for(i=0;i<9;i++)
  224.               {
  225.                 if(i!=mynode)
  226.                 {
  227.                 switch(Nodes->MyNode[mynode].Stats[i].Status)
  228.                 {
  229.                   case CHAT_NTXT:
  230.                      if(Nodes->MyNode[mynode].Channel==Nodes->MyNode[i].Channel)
  231.                      {
  232.                       temp[3]=Nodes->MyNode[i].ChatColor+'0';
  233.                       sm("",1);Process(1,0);
  234.                        sm(temp,0); sm(Nodes->MyNode[i].Handle,0); sm("> ",0);
  235.                        Process(2,strlen(Nodes->MyNode[i].Handle)+2);
  236.                        Last = 2;
  237.                      if(Nodes->MyNode[mynode].Stats[i].info==10 ||
  238.                         Nodes->MyNode[mynode].Stats[i].info==13)
  239.                      { sm("",1); Process(1,0);  } else  
  240.                      { sm(temp,0); Process(0,Nodes->MyNode[mynode].Stats[i].info); }
  241.                       }
  242.                      Nodes->MyNode[mynode].Stats[i].Status=CHAT_IDLE;
  243.                       break;
  244.                      case CHAT_TEXT:
  245.                      if(Nodes->MyNode[mynode].Channel==Nodes->MyNode[i].Channel)
  246.                      {
  247.                      temp[3]=Nodes->MyNode[i].ChatColor+'0';
  248.                       if(Nodes->MyNode[mynode].Stats[i].info==10 ||
  249.                         Nodes->MyNode[mynode].Stats[i].info==13)
  250.                      { sm("",1); Process(1,0); } else  
  251.                      { sm(temp,0); Process(0,Nodes->MyNode[mynode].Stats[i].info); }
  252.                      }  
  253.                       Nodes->MyNode[mynode].Stats[i].Status=CHAT_IDLE;
  254.                      
  255.                               break;
  256.                   case CHAT_ENTER:
  257.                      if(Nodes->MyNode[mynode].Stats[i].info==1)
  258.                      {
  259.                      sm("",1);
  260.                      temp[3]=Nodes->MyNode[i].ChatColor+'0'; Process(1,0);
  261.                      sm(temp,0); sm(Nodes->MyNode[i].Handle,0);
  262.                      sm(" enters chat room.",1); Last=2;
  263.                      }
  264.                      Nodes->MyNode[mynode].Stats[i].Status=CHAT_IDLE;
  265.                      break;
  266.                   case CHATROOM_EXIT:
  267.                      if(Nodes->MyNode[mynode].Stats[i].info==1)
  268.                      {
  269.                      sm("",1);
  270.                      temp[3]=Nodes->MyNode[i].ChatColor+'0'; Process(1,0);
  271.                      sm(temp,0);
  272.                      sm(Nodes->MyNode[i].Handle,0);
  273.                      sm(" exits chat room.",1); Last=2;
  274.                      }
  275.                      Nodes->MyNode[mynode].Stats[i].Status=CHAT_IDLE;
  276.                      break;
  277.                 case CHAT_EXIT:
  278.                      if(Nodes->MyNode[mynode].Stats[i].info==1)
  279.                      {
  280.                      sm("",1);
  281.                      temp[3]=Nodes->MyNode[i].ChatColor+'0'; Process(1,0);
  282.                      sm(temp,0);
  283.                      sm(Nodes->MyNode[i].Handle,0);
  284.                      sm(" exits chat room.",1); Last=2;
  285.                      }
  286.                      Nodes->MyNode[mynode].Stats[i].Status=CHAT_NONE;
  287.                      break;
  288.                   case CHAT_INVITE:
  289.                      sm("",1);
  290.                      sprintf(temp1,"Chat Invitation from Room (%d)",Nodes->MyNode[i].Channel);
  291.                      sm(temp1,1); sm("",1);
  292.                      Process(1,0); Last=2;
  293.                      break;
  294.                  }
  295.                 }
  296.               }
  297.               ReleaseSemaphore((struct SignalSemaphore *)Nodes);
  298.               break;
  299.          case CTRL('X'): ShutDown(); end();
  300.               break;
  301.          case CTRL('F'):
  302.               ShowMenu(); Process(1,0); Last=2;break;
  303.          case CTRL('N'): who(0); Process(1,0); Last=2; break;
  304.          case CTRL('D'): who(1); Process(1,0); Last=2; break;
  305.          case CTRL('P'): page(); Process(1,0); Last=2; sm("",1); break;
  306.          case CTRL('A'): ObtainSemaphore((struct SignalSemaphore *)Nodes);
  307.               ShowActive(); ReleaseSemaphore((struct SignalSemaphore *)Nodes);
  308.               Process(1,0); Last=2; sm("",1);
  309.               break;
  310.          case CTRL('I'): ObtainSemaphore((struct SignalSemaphore *)Nodes);
  311.               ShowActive();  ReleaseSemaphore((struct SignalSemaphore *)Nodes); Process(1,0); Last=2; sm("",1);
  312.               hk("Which Node you wish to Invite or (enter) to abort >:",temp1);
  313.               i=atoi(temp1);
  314.               if(temp1[0]=='\0' || temp1[0]==13 || temp1[0]==10 || i<0 || i>8)
  315.               {
  316.                 sm("Aborting.",1); sm("",1); 
  317.               }
  318.               else
  319.               {
  320.                 sm(temp1,1); sm("",1);
  321.                 ObtainSemaphore((struct SignalSemaphore *)Nodes);
  322.                 if(Nodes->MyNode[mynode].Stats[i].Status!=CHAT_NONE && Nodes->MyNode[mynode].Stats[i].Status!=CHAT_EXIT && i!=mynode &&
  323.                    Nodes->MyNode[i].Channel!=Nodes->MyNode[mynode].Channel)
  324.                 {
  325.                    Nodes->MyNode[i].Stats[mynode].Status=CHAT_INVITE;
  326.                    Signal(Nodes->MyNode[i].t,Nodes->MyNode[i].tasksignal);
  327.                    sm("Node (",0); sm(temp1,0); sm("Invited!",1);
  328.                    sm("",1); 
  329.                 }
  330.                 else
  331.                 {
  332.                   sm("Invalid Request",1); sm("",1);
  333.                 }
  334.                 ReleaseSemaphore((struct SignalSemaphore *)Nodes);
  335.               }
  336.               break;
  337.          case CTRL('R'): ObtainSemaphore((struct SignalSemaphore *)Nodes);
  338.               lastchannel=Nodes->MyNode[mynode].Channel;
  339.               Nodes->MyNode[mynode].Channel=-1;
  340.               ReleaseSemaphore((struct SignalSemaphore *)Nodes);
  341.               sm("",1);
  342.               sm("Enter New Room# or (enter) to remain >:",0);
  343.               pm("",temp1,4);
  344.               if(temp1[0]=='\0' || temp1[0]==13 || temp1[0]==10 || atoi(temp1)<0 || atoi(temp1)>1000)
  345.               {
  346.                 ObtainSemaphore((struct SignalSemaphore *)Nodes);
  347.                 Nodes->MyNode[mynode].Channel=lastchannel;
  348.                 ReleaseSemaphore((struct SignalSemaphore *)Nodes);
  349.                 sm("",1);
  350.                 sm("Remaining in current Room.",1);
  351.                 sm("",1);
  352.                 Process(1,0);
  353.                 Last=2;
  354.               }
  355.               else
  356.               {
  357.                 sm("Private (Y/n>:",0);
  358.                 hk("",temp2); if(temp2[0]=='N' || temp2[0]=='n')
  359.                 {
  360.                    sm("No.",1);
  361.                 }else sm("Yes.",1);
  362.                 ObtainSemaphore((struct SignalSemaphore *)Nodes);
  363.                   SingleNode=(struct SinglePort *)Nodes->MyNode[mynode].s;
  364.                   ObtainSemaphore((struct SignalSemaphore *)SingleNode);
  365.                     status=SingleNode->Status;
  366.                   ReleaseSemaphore((struct SignalSemephore *)SingleNode);
  367.                 Nodes->MyNode[mynode].Channel=atoi(temp1);
  368.                 if(temp2[0]!='N' && temp2[0]!='n')Nodes->MyNode[mynode].Private=TRUE;
  369.                 else Nodes->MyNode[mynode].Private = FALSE;
  370.                 for(i=0;i<9;i++)
  371.                 {
  372.                   if(i!=mynode)
  373.                   {
  374.                   if(Nodes->MyNode[i].Channel==Nodes->MyNode[mynode].Channel)
  375.                   {
  376.                      Nodes->MyNode[i].Stats[mynode].Status=CHAT_ENTER;
  377.                      Nodes->MyNode[i].Stats[mynode].info=(status>=-1) ?1:0;
  378.                   }
  379.                   else 
  380.                   {
  381.                      if(Nodes->MyNode[i].Channel==lastchannel)
  382.                      {
  383.                         Nodes->MyNode[i].Stats[mynode].info=(status>=-1) ?1:0;
  384.                         Nodes->MyNode[i].Stats[mynode].Status=CHATROOM_EXIT;
  385.                      }
  386.                      else {
  387.                             Nodes->MyNode[i].Stats[mynode].info=0;
  388.                             Nodes->MyNode[i].Stats[mynode].Status=CHATROOM_EXIT;
  389.                           }
  390.                   }
  391.                  if(Nodes->MyNode[i].t!=NULL && Nodes->MyNode[mynode].Stats[i].Status!=CHAT_EXIT &&
  392.                       Nodes->MyNode[mynode].Stats[i].Status!=CHAT_NONE)
  393.                    Signal(Nodes->MyNode[i].t,Nodes->MyNode[i].tasksignal);
  394.            
  395.                  }
  396.                 }  
  397.                 ReleaseSemaphore((struct SignalSemaphore *)Nodes);
  398.                 sm("Moving to Room (",0);
  399.                 sm(temp1,0); sm(")",1);
  400.                 
  401.                 sm("",1);
  402.                 Process(1,0);
  403.                 Last=2;
  404.               }
  405.                 break; 
  406.          default:
  407.               if(Last==1 && mes[0]!=13 && mes[0]!=10) { Last=2; }
  408.               ObtainSemaphore((struct SignalSemaphore *)Nodes);
  409.               temp[3]=Nodes->MyNode[mynode].ChatColor+'0';
  410.             
  411.               for(i=0;i<9;i++)
  412.               {
  413.                  if(i!=mynode && Nodes->MyNode[i].Channel==Nodes->MyNode[mynode].Channel)
  414.                  {
  415.                    Nodes->MyNode[i].Stats[mynode].info=mes[0];
  416.                    if(Last==2)
  417.                    Nodes->MyNode[i].Stats[mynode].Status=CHAT_NTXT;
  418.                       else Nodes->MyNode[i].Stats[mynode].Status=CHAT_TEXT;
  419.                    if(Nodes->MyNode[i].t!=NULL && Nodes->MyNode[mynode].Stats[i].Status!=CHAT_EXIT &&
  420.                       Nodes->MyNode[mynode].Stats[i].Status!=CHAT_NONE)
  421.                    Signal(Nodes->MyNode[i].t,Nodes->MyNode[i].tasksignal);
  422.                  }
  423.                 
  424.               }
  425.               
  426.               ReleaseSemaphore((struct SignalSemaphore *)Nodes);
  427.          if(mes[0]==13 || mes[0]==12 ) { sm("",1); Last=1; Process(1,0);} else {
  428.               if(Last==2) {
  429.                 sm(temp,1); Process(1,0);  sm(myname,0); sm("> ",0);
  430.                 Process(2,strlen(myname)+2); }Last=0; sm(temp,0);Process(0,mes[0]); }
  431.               break;
  432.       }
  433.    }
  434. }
  435. char Buf[100];
  436. void Process(int opt, int info)
  437. {
  438.   static int Buffer=0;
  439.   static int LastSpace=0;
  440.   int FoundSpace;
  441.   register int i;
  442.   char singlebuf[2];
  443.   if(opt==2)
  444.   {
  445.     i=0; while(i<info) { Buf[i]=' '; i++; }
  446.     Buffer=info-1;
  447.     LastSpace=Buffer+1;
  448.     return;
  449.   }
  450.   if(opt==1)
  451.   {
  452.     i=0; while(i<3) { Buf[i]=' '; i++; }
  453.     LastSpace=0;
  454.     Buffer=0;
  455.     return;
  456.   }
  457.   
  458.   if((info==8 || info=='\b' )&& Buffer>=LastSpace)
  459.   {
  460.      sm("\b \b",0); 
  461.     Buffer -=1;// if(Buffer<0) Buffer=0;
  462.    
  463.     return;
  464.   }else if(info==8 || info=='\b') return;
  465.   Buffer++;
  466.   if(Buffer<0) { sm("",1); sm("Buffer Error",1); return;}
  467.   if(Buffer==79)
  468.   {
  469.       Buf[80]='\0';
  470.       i=strlen(Buf)-1;
  471.       FoundSpace=0;
  472.       while(i>=0)
  473.       {
  474.          if(Buf[i]==' ') { FoundSpace=1; i++; break;}
  475.          i--;
  476.       }
  477.       
  478.       if(FoundSpace)
  479.       {
  480.         FoundSpace=strlen(&Buf[i]); 
  481.         while(FoundSpace) { sm("\b \b",0); FoundSpace--; }
  482.         sm("",1);
  483.         if(Buf[i]!=' ')
  484.         sm(&Buf[i],0);
  485.         Buffer=0;
  486.         while(Buf[i]!='\0') { Buf[Buffer]=Buf[i]; Buffer++; i++; }
  487.         
  488.       }
  489.       else { Buffer=0; }
  490.       LastSpace=0;
  491.   }
  492.    singlebuf[0]=info; singlebuf[1]='\0'; sm(singlebuf,0); Buf[Buffer]=info;
  493. }  
  494. void LastCommand(void)
  495. {
  496.    register int i;
  497.    int status; 
  498.    DeletePort((struct MsgPort *)mychatp);
  499.    ObtainSemaphore((struct SignalSemaphore *)Nodes);
  500.      SingleNode=(struct SinglePort *)Nodes->MyNode[mynode].s;
  501.      ObtainSemaphore((struct SignalSemaphore *)SingleNode);
  502.       status=SingleNode->Status;
  503.      ReleaseSemaphore((struct SignalSemaphore *)SingleNode);
  504. Nodes->MyNode[mynode].t=NULL;
  505.    for(i=0;i<9;i++)
  506.    {
  507.      
  508.      Nodes->MyNode[i].Stats[mynode].Status=CHAT_EXIT;
  509.  if(Nodes->MyNode[i].t!=NULL && i!=mynode && Nodes->MyNode[mynode].Stats[i].Status!=CHAT_NONE &&
  510.     Nodes->MyNode[mynode].Stats[i].Status!=CHAT_EXIT)
  511.     {
  512.        if(Nodes->MyNode[i].Channel==Nodes->MyNode[mynode].Channel)
  513.         Nodes->MyNode[i].Stats[mynode].info=(status>=-1)?1:0; else Nodes->MyNode[i].Stats[mynode].info=0;
  514.  
  515.      Signal(Nodes->MyNode[i].t,Nodes->MyNode[i].tasksignal);
  516.     }
  517.    }
  518.    ReleaseSemaphore((struct SignalSemaphore *)Nodes);
  519.    PutInfo(0,BB_NONSTOPTEXT);
  520.    sm("",1);
  521. }
  522. void end(void)
  523. {
  524.   exit(0);
  525. }
  526. void creds(void)
  527. {
  528.   sm("",1);
  529.   sm( "           .-----------------------------------------------------.",1);
  530.   sm( "           | Ami-Express Multi-Node Interactive Chat Version 2.8 |",1);
  531.   sm( "           |                 Written by ByteMaster.              |",1);
  532.  // sm( "           |             v2.9 Beta for UnLawful Entry.           |",1);
  533.   sm( "           |      /X Development Team - The Silent Achievers     |",1);
  534.   sm( "           `-----------------------------------------------------'",1);
  535.   sm("",1);
  536. }
  537.  
  538. void ShowActive(void)
  539. {
  540.   register int i;
  541.   register int status;
  542.   char temp1[200]; sm("",1);
  543.         
  544.  sm("Users in chat",1);
  545.             sm("-------------",1);
  546.   for(i=0;i<9;i++)
  547.       {
  548.   SingleNode=(struct SinglePort *)Nodes->MyNode[i].s;
  549.           
  550.   ObtainSemaphore((struct SignalSemaphore *)SingleNode);
  551.               status=SingleNode->Status;
  552.            ReleaseSemaphore((struct SignalSemaphore *)SingleNode);
  553.  
  554.         if((Nodes->MyNode[mynode].Stats[i].Status!=CHAT_EXIT &&
  555.            Nodes->MyNode[mynode].Stats[i].Status!=CHAT_NONE) || i==mynode)
  556.           {
  557.            if(status>=-1 || mynode==i)
  558.            {
  559.            if(!Nodes->MyNode[i].Private || i==mynode || Nodes->MyNode[i].Channel==Nodes->MyNode[mynode].Channel)
  560.            sprintf(temp1,"Rm(%4d) Node %dm %d (%4ld mins)> %dm%s",Nodes->MyNode[i].Channel,i+1,i,(time(NULL)-Nodes->MyNode[i].StartTime)/60L,i+1,Nodes->MyNode[i].Handle);
  561.            else           
  562.            sprintf(temp1,"Rm(   ?) Node %dm %d (%4ld mins)> %dm%s",i+1,i,(time(NULL)-Nodes->MyNode[i].StartTime)/60L,i+1,Nodes->MyNode[i].Handle);
  563.            sm(temp1,1);
  564.            }
  565.           }
  566.         }
  567.    sm("",1);
  568. }
  569.  
  570. void page(void)
  571. {
  572. char inp[100], portnm[100], mes[100];
  573. int status;
  574. long portsig;
  575. struct MsgPort *otport;
  576. struct JHMessage pagemsg;
  577.     portsig=1<<mychatp->mp_SigBit;
  578.   
  579.   sm("",1);
  580.  
  581.   while(1)
  582.   {
  583.   hk( "- Page Which Node? [Node #] Or [Q] To Quit: " ,inp); 
  584.    if(inp[0]=='Q' || inp[0]=='q') { sm(inp,1); return;}
  585.    if(atoi(inp)>=0 && atoi(inp)<9 && atoi(inp)!=mynode){ sm(inp,1);break;}
  586.    sm("",1);
  587.   } 
  588.   SingleName[6]=inp[0];
  589.   sm("",1);
  590.   sprintf( portnm, "AEServer.%d", atoi(inp));
  591.   ObtainSemaphore((struct SignalSemaphore *)Nodes);
  592.      SingleNode=(struct SinglePort *)Nodes->MyNode[atoi(inp)].s;
  593.   ReleaseSemaphore((struct SignalSemaphore *)Nodes);
  594.   if(SingleNode)
  595.   {
  596.     
  597.    ObtainSemaphore((struct SignalSemaphore *)SingleNode);
  598.    status=SingleNode->Status;
  599.    ReleaseSemaphore((struct SignalSemaphore *)SingleNode);
  600.   if(status==0)
  601.   {
  602.   otport = FindPort( (UBYTE *)portnm );
  603.   if( otport == 0 ) { sm( "- Node Unavailable!",1); ReleaseSemaphore((struct SignalSemaphore *)SingleNode);return; }
  604.   pagemsg.Msg.mn_Node.ln_Type=NT_MESSAGE;
  605.   pagemsg.Msg.mn_Length=sizeof(struct JHMessage);
  606.   pagemsg.Msg.mn_ReplyPort=mychatp;
  607.   pagemsg.Data = 0;
  608.   pagemsg.Command = 3;
  609.   sprintf(pagemsg.String,
  610.    "\a\n\r\n\rChat Request! From Node:%d ) User[%s]\n\r\n\r", mynode, Nodes->MyNode[mynode].Handle );
  611.   PutMsg(otport, (struct Message *)&pagemsg);
  612.   WaitPort(mychatp);GetMsg(mychatp);
  613.   pagemsg.Command = 3;
  614.   sprintf(pagemsg.String, "Press [Return] To Resume BBS Operations. Use [CHAT] To Chat With %s\n\r\n\r", Nodes->MyNode[mynode].Handle );
  615.   PutMsg(otport, (struct Message *)&pagemsg);
  616.   WaitPort(mychatp);
  617.   GetMsg(mychatp);
  618.   }
  619.    switch(status)
  620.   {
  621.      case 0:sprintf( mes, "- Chat Request Sent To Node:%d )", atoi(inp)); break;
  622.      case 1:  strcpy( mes, "- User is Downloading."); break;
  623.      case 2:  strcpy( mes, "- User is Uploading."); break;
  624.      case 3:  strcpy( mes, "- User is In a door."); break;
  625.      case 4:  strcpy( mes, "- User is Reading Mail."); break;
  626.      case 5:  strcpy( mes, "- User is Reviewing Stats."); break;
  627.      case 6:  strcpy( mes, "- User is Account Editing."); break;
  628.      case 7:  strcpy( mes, "- User is Zooming."); break;
  629.      case 8:  strcpy( mes, "- User is Viewing File Listings."); break;
  630.      case 9:  strcpy( mes, "- User is Reading Bulletins."); break;
  631.      case 10: strcpy( mes, "- User is Viewing Files."); break;
  632.     case 11:  strcpy( mes, "- Account Sequence."); break;
  633.      case 12:  strcpy( mes, "- User is Logging Off."); break;
  634.      case 13:  strcpy( mes, "- User is Sysoping."); break;
  635.      case 14:  strcpy( mes, "- User is using Shell."); break;
  636.      case 15:  strcpy( mes, "- User is using the EDITOR.");break;
  637.      case 16:  strcpy( mes, "- User is Joining a Conference.");break;
  638.      case 17:  strcpy( mes, "- User is Chatting.");break;
  639.      case 18:  strcpy( mes, "- NODE INACTIVE.");break;
  640.      case 19:  strcpy( mes, "- User is Requesting Sysop Chat.");break;
  641.      case 20:  strcpy( mes, "- User is Connecting.");break;
  642.      case 21:  strcpy( mes, "- User is logging on.");break;
  643.      case 22:  strcpy( mes, "- Node is Awaiting Connect.");break;
  644.      case 23:  strcpy( mes, "- User is Scanning Mail.");break;
  645.      case 24:  strcpy( mes, "- Node is ShutDown.");break;
  646.      case 25:  strcpy( mes, "- User is in MultiChat.");break;
  647.      case 26:  strcpy( mes, "- Node is Suspended.");break;
  648.      case 27:  strcpy( mes, "- Node is Reserved.");break;
  649.      case -1:  strcpy( mes, "- Node is unavailable.");break;
  650.      default: strcpy(mes,"- NODE INACTIVE.");
  651.   }
  652.    sm( mes,1 );
  653.    if(status!=0)
  654.    {
  655.      sm("Chat Denied",1);
  656.    }
  657.   }
  658.   else
  659.   sm("Cannot Locate Node",1);
  660.   return;
  661.  
  662. }
  663.  
  664. void ShowMenu(void)
  665. {
  666.   sm("",1);
  667.   sm("<CTRL-X> Exit Chat",1);
  668.   sm("<CTRL-N> WHO's Online",1);
  669.   sm("<CTRL-P> Page Node",1);
  670.   sm("<CTRL-A> Active Chatters",1);
  671.   sm("<CTRL-R> Change Rooms",1);
  672.   sm("<CTRL-I> Invite Node",1);
  673.   sm("",1);
  674. }
  675.  
  676. void who(int opt) 
  677. {
  678. char FileName[100], mes[100],mes2[100],mes1[100];
  679. char Name[100],Location[100];
  680. struct SinglePort *s;
  681. int status;
  682. int i=0;
  683. Delay(10L);
  684.  sm("",1);
  685.  sm("",1);
  686.  sm(".---+----------------------+---------------------------+----------------------.",1);
  687.  
  688.   sm("|Nd#| Name/Handle          Location         ",0);
  689.   sm("         | Action               |",1);
  690.   sm(")---+----------------------+---------------------------+----------------------(",1);
  691.   i=0;
  692.   
  693.   while(i<9)
  694.   {
  695.    ObtainSemaphore((struct SignalSemaphore *)Singles[i]);
  696.    s=(struct SinglePort *)Singles[i];
  697.   status=s->Status;
  698.   strcpy(Name,s->Handle);
  699.   strcpy(Location,s->Location);
  700.   strcpy(FileName,s->Misc1);
  701.    if(opt)
  702.   {
  703.       sprintf(mes, "%-20ld | %-25ld |",(ULONG)s,(ULONG)Nodes);sprintf(mes1," %-20d |",s->semi.ss_NestCount); 
  704.       sprintf(mes2,"%d ",i);
  705.          sm(mes2,0); sm(mes,0); sm(mes1,1);
  706.      sm("|---+----------------------+---------------------------+----------------------|",1);
  707.    ReleaseSemaphore((struct SignalSemaphore *)Singles[i]);
  708.  i++; continue;
  709.   }
  710.   ReleaseSemaphore((struct SignalSemaphore *)Singles[i]);
  711.  
  712.   switch(status)
  713.   {
  714.      case 0:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","IDLE"); break;
  715.      case 1:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);
  716.               if(FileName[0]!='\0')
  717.                sprintf(mes1," DL: %-16.16s |",FileName);
  718.               else
  719.               sprintf(mes1," %-20.20s |","BEGINNING DL"); break;
  720.      case 2:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);
  721.               if(FileName[0]!='\0')
  722.                sprintf(mes1," UL: %-16.16s |",FileName);
  723.               else sprintf(mes1," %-20.20s |","BEGINNING UL"); break;
  724.      case 3:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);
  725.      if(i==mynode)
  726.      sprintf(mes1," %-20.20s |","InfoNode v2.3a"); else
  727.     sprintf(mes1," %-20.20s |","MODULE"); break;
  728.      case 4:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","READING MAIL"); break;
  729.      case 5:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","REVIEWING STATS"); break;
  730.      case 6:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","ACCOUNT EDITING"); break;
  731.      case 7:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","ZOOMING"); break;
  732.      case 8:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","VIEWING DIRS"); break;
  733.      case 9:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","READING BULLS"); break;
  734.     case 10:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","VIEWING FILES"); break;
  735.     case 11:  sprintf(mes, "%-20.20s | %-25.25s |","","");sprintf(mes1," %-20.20s |","ACCOUNT SEQUENCE"); break;
  736.     case 12:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","LOGGING OFF"); break;
  737.     case 13:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","SYSOPING"); break;
  738.     case 14:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","USING SHELL"); break;
  739.     case 15:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","EDITING");break;
  740.     case 16:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","JOINING CONF");break;
  741.     case 17:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","CHATTING");break;
  742.     case 18:  sprintf(mes, "%-20.20s | %-25.25s |","","");sprintf(mes1," %-20.20s |","NODE INACTIVE.");break;
  743.     case 19:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","REQUESTING CHAT");break;
  744.     case 20:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","CONNECTING");break;
  745.     case 21:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","LOGGING ON");break;
  746.     case 22:  sprintf(mes, "%-20.20s | %-25.25s |","","");sprintf(mes1," %-20.20s |","AWAITING CONNECT");break;
  747.     case 23:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","SCANNING MAIL");break;
  748.     case 24:  sprintf(mes, "%-20.20s | %-25.25s |","","");sprintf(mes1," %-20.20s |","SHUTDOWN");break;
  749.     case 25:  sprintf(mes, "%-20.20s | %-25.25s |",Name,Location);sprintf(mes1," %-20.20s |","MULTICHAT");break;
  750.     case 26:  sprintf(mes, "%-20.20s | %-25.25s |","","");sprintf(mes1," %-20.20s |","SUSPENDED");break;
  751.     case 27:  sprintf(mes, "%-20.20s | %-25.25s |","","");sprintf(mes1," %-20.20s |","RESERVED");break;
  752.     case -1:  sprintf(mes, "%-20.20s | %-25.25s |","","");sprintf(mes1," %-20.20s |","UNAVAILABLE");break;
  753.     default:  sprintf(mes, "%-20.20s | %-25.25s |","","");sprintf(mes1," %-20.20s |","");break;
  754.   
  755.   }
  756.   sprintf(mes2,"%d ",i);
  757.   if(status!=27 && status>=0 && status!=24 && status!=18)
  758.   {
  759.     sm(mes2,0); sm(mes,0); sm(mes1,1);
  760.   sm("|---+----------------------+---------------------------+----------------------|",1);
  761.  
  762.   }
  763.   i++;
  764.   }
  765.  sm("`---------------------------------------------------------InfoNode-v2.3a------'",1);
  766.  sm("",1);
  767.  // sm("`--------InfoNode-v2.3a-------------Special Release for-UnLawful Entry--------'",1);
  768.  
  769. }
  770.